package teste.objetos;

import java.util.ArrayList;
import java.util.List;

import junit.framework.Assert;

import org.junit.Before;
import org.junit.Test;

import objetos.*;

public class TestItem {
	
	private Item itemUm;
	private Item itemDois;
	private Item itemTres;
	private Usuario usuarioUm;
	private Usuario usuarioDois;
	private Usuario usuarioTres;
	private List<Usuario> verificaInteressados;
	
	@Before
	public void setUp() throws Exception{
		this.usuarioUm = new Usuario("usuario1", "Usuario Numero 1", "Endereco 1");
		this.usuarioDois = new Usuario("usuario2", "Usuario Numero 2", "Endereco 2");
		this.usuarioTres = new Usuario("usuario3", "Usuario Numero 3", "Endereco 3");
		this.itemUm = new Item(this.usuarioUm, "ItemUm", "Item de Teste 1", "Filme", 1);
		this.itemDois = new Item(this.usuarioDois, "ItemDois", "Item de Teste 2", "Livro", 2);
		this.itemTres = new Item(this.usuarioTres, "ItemTres", "Item de Teste 3", "Jogo", 3);
		this.verificaInteressados = new ArrayList<Usuario>();
		
	}
	
	@Test
	public void verificaConstrutor(){
		try{
			new Item(this.usuarioUm, "", "Descricao", "Filme", 2);
			Assert.fail("Nome Vazio(String Vazia)!");
		}
		catch (Exception e){
			Assert.assertEquals("Nome Vazio!", "Nome inválido", e.getMessage());
		}
		
		try{
			new Item(this.usuarioUm, null, "Descricao", "Filme", 2);
			Assert.fail("Nome Nulo!");
		}
		catch (Exception e){
			Assert.assertEquals("Nome nulo!", "Nome inválido", e.getMessage());
		}
		
		try{
			new Item(this.usuarioUm, "Nome", "Descricao", "", 2);
			Assert.fail("Categoria Vazia(String Vazia)!");
		}
		catch (Exception e){
			Assert.assertEquals("Categoria Vazia!", "Categoria inválida", e.getMessage());
		}
		
		try{
			new Item(this.usuarioUm, "Nome", "Descricao", null, 2);
			Assert.fail("Categoria nula!");
		}
		catch (Exception e){
			Assert.assertEquals("Categoria Nula!", "Categoria inválida", e.getMessage());
		}
		
		try{
			new Item(this.usuarioUm, "Nome", "Descricao", "Celular", 2);
			Assert.fail("Categoria Inexistente!");
		}
		catch (Exception e){
			Assert.assertEquals("Categoria Inexistente!", "Categoria inexistente", e.getMessage());
		}
		
	}
	
	@Test
	public void verificaSetGetId(){
		Assert.assertEquals(1, this.itemUm.getId());
		Assert.assertEquals(2, this.itemDois.getId());
		Assert.assertEquals(3, this.itemTres.getId());
		
		this.itemUm.setId(10);
		Assert.assertEquals(10, this.itemUm.getId());
		
		this.itemDois.setId(20);
		Assert.assertEquals(20, this.itemDois.getId());
		
		this.itemTres.setId(30);
		Assert.assertEquals(30, this.itemTres.getId());
		
	}
	
	@Test
	public void verificaGetSetDono(){
		Assert.assertEquals(this.usuarioUm, this.itemUm.getDono());
		Assert.assertEquals(this.usuarioDois, this.itemDois.getDono());
		Assert.assertEquals(this.usuarioTres, this.itemTres.getDono());
		
		this.itemUm.setDono(this.usuarioDois);
		Assert.assertEquals(this.usuarioDois, this.itemUm.getDono());
		
		this.itemDois.setDono(this.usuarioTres);
		Assert.assertEquals(this.usuarioTres, this.itemDois.getDono());
		
		this.itemTres.setDono(this.usuarioUm);
		Assert.assertEquals(this.usuarioUm, this.itemTres.getDono());
		
	}
	
	@Test
	public void verificaGetSetCategoria(){
		Assert.assertEquals("Filme", this.itemUm.getNameCategoriaFromCategoria(Item.TipoDeItem.FILME));
		Assert.assertEquals(Item.TipoDeItem.FILME, this.itemUm.getTipoDeItem());
		Assert.assertEquals("Livro", this.itemDois.getNameCategoriaFromCategoria(Item.TipoDeItem.LIVRO));
		Assert.assertEquals(Item.TipoDeItem.LIVRO, this.itemDois.getTipoDeItem());
		Assert.assertEquals("Jogo", this.itemTres.getNameCategoriaFromCategoria(Item.TipoDeItem.JOGO));
		Assert.assertEquals(Item.TipoDeItem.JOGO, this.itemTres.getTipoDeItem());
		
		this.itemUm.setCategoria(Item.TipoDeItem.LIVRO);
		Assert.assertEquals(Item.TipoDeItem.LIVRO, this.itemUm.getTipoDeItem());
		
		this.itemDois.setCategoria(Item.TipoDeItem.JOGO);
		Assert.assertEquals(Item.TipoDeItem.JOGO, this.itemDois.getTipoDeItem());
		
		this.itemTres.setCategoria(Item.TipoDeItem.FILME);
		Assert.assertEquals(Item.TipoDeItem.FILME, this.itemTres.getTipoDeItem());
		
	}
	
	@Test
	public void verificaGetSetNome(){
		Assert.assertEquals("ItemUm", this.itemUm.getNome());
		Assert.assertEquals("ItemDois", this.itemDois.getNome());
		Assert.assertEquals("ItemTres", this.itemTres.getNome());
		
		this.itemUm.setNome("Item1");
		Assert.assertEquals("Item1", this.itemUm.getNome());
		
		this.itemDois.setNome("Item2");
		Assert.assertEquals("Item2", this.itemDois.getNome());

		this.itemTres.setNome("Item3");
		Assert.assertEquals("Item3", this.itemTres.getNome());
		
	}
	
	@Test
	public void verificaGetSetDescricao(){
		Assert.assertEquals("Item de Teste 1", this.itemUm.getDescricao());
		Assert.assertEquals("Item de Teste 2", this.itemDois.getDescricao());
		Assert.assertEquals("Item de Teste 3", this.itemTres.getDescricao());
		
		this.itemUm.setDescricao("Descricao do Item de Teste 1");
		Assert.assertEquals("Descricao do Item de Teste 1", this.itemUm.getDescricao());
		
		this.itemDois.setDescricao("Descricao do Item de Teste 2");
		Assert.assertEquals("Descricao do Item de Teste 2", this.itemDois.getDescricao());

		this.itemTres.setDescricao("Descricao do Item de Teste 3");
		Assert.assertEquals("Descricao do Item de Teste 3", this.itemTres.getDescricao());
		
	}
	
	@Test
	public void verificaGetSetStatus(){
		Assert.assertEquals(Item.StatusItem.DISPONIVEL, this.itemUm.getStatusDeItem());
		Assert.assertEquals(Item.StatusItem.DISPONIVEL, this.itemDois.getStatusDeItem());
		Assert.assertEquals(Item.StatusItem.DISPONIVEL, this.itemTres.getStatusDeItem());
		
		this.itemUm.setStatusItem(Item.StatusItem.EMPRESTADO);
		Assert.assertEquals(Item.StatusItem.EMPRESTADO, this.itemUm.getStatusDeItem());
		
		this.itemDois.setStatusItem(Item.StatusItem.EMPRESTADO);
		Assert.assertEquals(Item.StatusItem.EMPRESTADO, this.itemDois.getStatusDeItem());

		this.itemTres.setStatusItem(Item.StatusItem.EMPRESTADO);
		Assert.assertEquals(Item.StatusItem.EMPRESTADO, this.itemTres.getStatusDeItem());
		
	}
	
	@Test
	public void verificaGetSetInteressados(){
		Assert.assertEquals(new ArrayList<Usuario>(), this.itemUm.getListaDeUsuariosInteressados());
		Assert.assertEquals(new ArrayList<Usuario>(), this.itemDois.getListaDeUsuariosInteressados());
		Assert.assertEquals(new ArrayList<Usuario>(), this.itemTres.getListaDeUsuariosInteressados());
		
		this.verificaInteressados.add(this.usuarioDois);
		this.itemUm.setAdicionarUsuarioInteressado(this.usuarioDois);
		Assert.assertEquals(this.verificaInteressados, this.itemUm.getListaDeUsuariosInteressados());
		
		this.verificaInteressados.add(this.usuarioTres);
		this.itemUm.setAdicionarUsuarioInteressado(this.usuarioTres);
		Assert.assertEquals(this.verificaInteressados, this.itemUm.getListaDeUsuariosInteressados());
		
	}
	
}
